package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.constant.MessageConst;
import com.itheima.dao.MemberDao;
import com.itheima.dao.OrderDao;
import com.itheima.dao.OrderSettingDao;
import com.itheima.entity.Result;
import com.itheima.pojo.Member;
import com.itheima.pojo.Order;
import com.itheima.pojo.OrderSetting;
import com.itheima.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * @Version 1.0
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    OrderSettingDao orderSettingDao;

    @Autowired
    MemberDao memberDao;

    @Autowired
    OrderDao orderDao;


    /**
     * 1. 判断改日期是否进行预约设置，如果没有设置，返回不能预约
     * 2. 判断该日期是否预约已满： 如果已预约大于等于可预约， 返回预约已满
     * 3. 判断是否是会员，
     *      3.1 如果不是会员，自动注册为会员
     *      3.2 如果是会员
     *          3.2.1 更新会员的信息
     *          3.2.2 判断是否预约过此套餐（该会员是否预约了该日期的该套餐）
     * 4. 添加预约信息到数据库
     * 5. 更新预约设置信息： 已预约人数加一
     * @param map
     * @return
     */
    @Override
    @Transactional(isolation= Isolation.READ_COMMITTED)
    public Result addOrder(Map<String, String> map) throws ParseException {
        //获取预约日期
        String orderDateStr = map.get("orderDate");
        //日期类型转换
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date orderDate = sdf.parse(orderDateStr);
        //获取手机号码
        String telephone = map.get("telephone");
        //获取套餐id
        Integer setmealId = Integer.parseInt(map.get("setmealId"));

        //1. 判断改日期是否进行预约设置，如果没有设置，返回不能预约
        OrderSetting orderSetting = orderSettingDao.findByDate(orderDate);
        if(orderSetting == null){
            return new Result(false, MessageConst.SELECTED_DATE_CANNOT_ORDER);
        }
        //2. 判断该日期是否预约已满： 如果已预约大于等于可预约， 返回预约已满
        if(orderSetting.getReservations() >= orderSetting.getNumber()){
            return new Result(false,MessageConst.ORDER_FULL);
        }
        //3. 判断是否是会员
        Member member = memberDao.findByTelephone(telephone);
        //3.1 如果不是会员
        if(member == null){
            //创建会员对象
            member = new Member();
            //给会员对象赋值
            //档案编号
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            //档案编号： 日期 +  4位随机数
            String fileNumber = format.format(new Date()) + ValidateCodeUtils.generateValidateCode(4);
            member.setFileNumber(fileNumber);
            //姓名
            member.setName(map.get("name"));
            //性别
            member.setSex(map.get("sex"));
            //身份证号码
            member.setIdCard(map.get("idCard"));
            //手机号码
            member.setPhoneNumber(telephone);
            //注册时间
            member.setRegTime(new Date());
            //自动注册为会员(主键回显)
            memberDao.add(member);
        }
        //3.2 如果是会员
        else{
            //3.2.1 更新会员的信息
            member.setName(map.get("name"));
            member.setSex(map.get("sex"));
            member.setIdCard(map.get("idCard"));
            //更新会员信息
            memberDao.edit(member);
            //3.2.2 判断是否预约过此套餐（该会员是否预约了该日期的该套餐）
            //条件： 会员（member）  日期(orderDate)   套餐(参数中获取)
            //创建条件对象
            Order condition = new Order();
            condition.setMemberId(member.getId());
            condition.setOrderDate(orderDate);
            condition.setSetmealId(setmealId);
            //根据条件查询预约信息
            long count = orderDao.findByOrder(condition);
            if(count > 0){
                return new Result(false,MessageConst.HAS_ORDERED);
            }
        }
        //4. 添加预约信息到数据库
        //创建预约对象
        Order order = new Order();
        order.setMemberId(member.getId());
        order.setOrderDate(orderDate);
        order.setOrderType(map.get("orderType"));
        order.setOrderStatus(Order.ORDERSTATUS_NO);
        order.setSetmealId(setmealId);
        //添加预约信息
        orderDao.addOrder(order);
        //5. 更新预约设置信息： 已预约人数加一
        //10 , 8
        orderSetting.setReservations(orderSetting.getReservations() + 1);

        int state = 0;
        int count = orderSettingDao.edit(orderSetting);
            //如果count==0， 说明更新失败
        while(count == 0){
            //重新查询预约设置信息 // 10,9
            orderSetting = orderSettingDao.findByDate(orderDate);
            //2. 判断该日期是否预约已满： 如果已预约大于等于可预约， 返回预约已满
            if(orderSetting.getReservations() >= orderSetting.getNumber()){
                return new Result(false,MessageConst.ORDER_FULL);
            }
            //已预约人数加一
            orderSetting.setReservations(orderSetting.getReservations() + 1);
            //再次更新预约设置
            count = orderSettingDao.edit(orderSetting);
            state ++ ;
        }


        return new Result(true,MessageConst.ORDER_SUCCESS, order);
    }

    @Override
    public Map<String, Object> findById(Integer id) {
        return orderDao.findById(id);
    }
}
